home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
gnu
/
mtools.lha
/
mtools-2.0.7
/
expand.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-10
|
2KB
|
115 lines
/*
* Do filename expansion with the shell. Returns a pointer to a
* static area.
*/
#define EXPAND_BUF 2048
#include <stdio.h>
char *
expand(input)
char *input;
{
FILE *fp, *popen();
int last;
char buf[256], *strpbrk(), *strcpy();
static char ans[EXPAND_BUF];
if (input == NULL)
return(NULL);
if (*input == '\0')
return("");
/* any thing to expand? */
if (!strpbrk(input, "$*{}[]\\?~")) {
strcpy(ans, input);
return(ans);
}
/* popen an echo */
sprintf(buf, "echo %s", input);
fp = popen(buf, "r");
fgets(ans, EXPAND_BUF, fp);
pclose(fp);
if (!strlen(ans)) {
strcpy(ans, input);
return(ans);
}
/*
* A horrible kludge... if the last character is not a line feed,
* then the csh has returned an error message. Otherwise zap the
* line feed.
*/
last = strlen(ans) - 1;
if (ans[last] != '\n') {
strcpy(ans, input);
return(ans);
}
else
ans[last] = '\0';
return(ans);
}
/*
* Miscellaneous routines probably missing from Bezerkely
*/
#ifdef BSD
/*
* Return ptr to first occurrence of any character from `brkset'
* in the character string `string'; NULL if none exists.
*/
char *
strpbrk(string, brkset)
register char *string, *brkset;
{
register char *p;
if (!string || !brkset)
return(0);
do {
for (p = brkset; *p != '\0' && *p != *string; ++p)
;
if (*p != '\0')
return(string);
}
while (*string++);
return(0);
}
/*
* Copies the character c, n times to string s
*/
char *
memset(s, c, n)
char *s, c;
int n;
{
char *s1 = s;
while (n > 0) {
--n;
*s++ = c;
}
return(s1);
}
/*
* Copy contents of memory (with possible overlapping).
*/
char *
memcpy(s1, s2, n)
char *s1, *s2;
int n;
{
bcopy(s2, s1, n);
return(s1);
}
#endif /* BSD */